package com.simple.datax.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * @Title: MessageGZIP.java
 * @Package com.simple.datax.utils
 * @Description: GZIP压缩解压类
 * @author Paladin Chen
 * @date 2013-1-7 下午9:02:21
 * @version V1.0
 */
public class MessageGZIP {
	private static String encode = "utf-8";// "ISO-8859-1"

	public String getEncode() {
		return encode;
	}

	/** 
	 * 设置 编码，默认编码：UTF-8
	 */
	public void setEncode(String encode) {
		MessageGZIP.encode = encode;
	}

	/** 
	 * 字符串压缩为字节数组
	 */
	public static byte[] compressToByte(String str) throws Exception {
		return compressToByte(str, encode);
	}

	/** 
	 * 字符串压缩为字节数组
	 */
	public static byte[] compressToByte(String str, String encoding) throws Exception {
		if (str == null || str.length() == 0) {
			return null;
		}

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		GZIPOutputStream gzip;

		try {
			gzip = new GZIPOutputStream(out);
			gzip.write(str.getBytes(encoding));
			gzip.close();
			
			byte[] ret =  out.toByteArray();
			out.close();

			return ret;
		} catch (IOException e) {
			//e.printStackTrace();
			throw e;
		}
	}

	/** 
	 * 字节数组解压缩后返回字符串
	 */
	public static String uncompressToString(byte[] b) throws Exception {
		return uncompressToString(b, encode);
	}

	/** 
	 * 字节数组解压缩后返回字符串
	 */
	public static String uncompressToString(byte[] b, String encoding) throws Exception {
		if (b == null || b.length == 0) {
			return null;
		}

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ByteArrayInputStream in = new ByteArrayInputStream(b);

		try {
			GZIPInputStream gunzip = new GZIPInputStream(in);
			byte[] buffer = new byte[256];
			int n;

			while ((n = gunzip.read(buffer)) >= 0) {
				out.write(buffer, 0, n);
			}

			String ret = out.toString(encoding);
			
			out.close();
			return ret;
		} catch (IOException e) {
			//e.printStackTrace();
			throw e;
		}
		//return null;
	}
}
